package cn.wen.core.refresh;

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;

/**
 * 可以添加底部了头部的RecyclerView
 */

public class HFRecyclerView extends RecyclerView {
    private Adapter mAdapter;
    private WrapAdapter mWrapRecyclerAdapter;

    // 增加一些通用功能
    // 空列表数据应该显示的空View
    // 正在加载数据页面，也就是正在获取后台接口页面
    private View mEmptyView, mLoadingView;

    private AdapterDataObserver mObserver = new AdapterDataObserver() {
        @Override
        public void onChanged() {
            if (mAdapter == null) return;
            // 观察者  列表Adapter更新 包裹的也需要更新不然列表的notifyDataSetChanged没效果
            if (mWrapRecyclerAdapter != mAdapter)
                mWrapRecyclerAdapter.notifyDataSetChanged();

            dataChanged();
        }

        @Override
        public void onItemRangeRemoved(int positionStart, int itemCount) {
            if (mAdapter == null) return;
            // 观察者  列表Adapter更新 包裹的也需要更新不然列表的notifyDataSetChanged没效果
            if (mWrapRecyclerAdapter != mAdapter)
                mWrapRecyclerAdapter.notifyItemRemoved(positionStart);
            dataChanged();
        }

        @Override
        public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
            if (mAdapter == null) return;
            // 观察者  列表Adapter更新 包裹的也需要更新不然列表的notifyItemMoved没效果
            if (mWrapRecyclerAdapter != mAdapter)
                mWrapRecyclerAdapter.notifyItemMoved(fromPosition, toPosition);
            dataChanged();
        }

        @Override
        public void onItemRangeChanged(int positionStart, int itemCount) {
            if (mAdapter == null) return;
            // 观察者  列表Adapter更新 包裹的也需要更新不然列表的notifyItemChanged没效果
            if (mWrapRecyclerAdapter != mAdapter)
                mWrapRecyclerAdapter.notifyItemChanged(positionStart);
            dataChanged();
        }

        @Override
        public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
            if (mAdapter == null) return;
            // 观察者  列表Adapter更新 包裹的也需要更新不然列表的notifyItemChanged没效果
            if (mWrapRecyclerAdapter != mAdapter)
                mWrapRecyclerAdapter.notifyItemChanged(positionStart, payload);
            dataChanged();
        }

        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            if (mAdapter == null) return;
            // 观察者  列表Adapter更新 包裹的也需要更新不然列表的notifyItemInserted没效果
            if (mWrapRecyclerAdapter != mAdapter)
                mWrapRecyclerAdapter.notifyItemInserted(positionStart);
            dataChanged();
        }
    };

    public HFRecyclerView(Context context) {
        this(context, null);
    }

    public HFRecyclerView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public HFRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setAdapter(Adapter adapter) {
        this.mAdapter = adapter;
        // 封装了一次
        if (adapter instanceof WrapAdapter) {
            mWrapRecyclerAdapter = (WrapAdapter) adapter;
        } else {
            mWrapRecyclerAdapter = new WrapAdapter(adapter);
            adapter.registerAdapterDataObserver(mObserver);
            //isRegister = true;
        }
        super.setAdapter(mWrapRecyclerAdapter);
    }


    public void addHeaderView(View view) {
        if (mWrapRecyclerAdapter == null) {
            return;
        }
        mWrapRecyclerAdapter.addHeaderView(view);
    }

    public void removeHeaderView(View view) {
        if (mWrapRecyclerAdapter == null) {
            return;
        }
        mWrapRecyclerAdapter.removeHeaderView(view);
    }

    public void addFooterView(View view) {
        if (mWrapRecyclerAdapter == null) {
            return;
        }
        mWrapRecyclerAdapter.addFooterView(view);
    }

    public void removeFooterView(View view) {
        if (mWrapRecyclerAdapter == null) {
            return;
        }
        mWrapRecyclerAdapter.removeFooterView(view);
    }


    /**
     * 添加一个空列表数据页面
     */
    public void addEmptyView(View emptyView) {
        this.mEmptyView = emptyView;
    }

    /**
     * 添加一个正在加载数据的页面
     */
    public void addLoadingView(View loadingView) {
        this.mLoadingView = loadingView;
        mLoadingView.setVisibility(View.VISIBLE);
    }

    /**
     * Adapter数据改变的方法
     */
    private void dataChanged() {
        if (mLoadingView != null) {
            mLoadingView.setVisibility(View.GONE);
        }
        if (mAdapter.getItemCount() == 0) {

            // 没有数据
            if (mEmptyView != null) {
                mEmptyView.setVisibility(VISIBLE);
            } else {
                if (mEmptyView != null)
                    mEmptyView.setVisibility(GONE);
            }
        }
    }

}
